/**
 * 习题集系统类 - 版本2.0
 * 提供完整的加减法口算练习功能，使用面向对象的继承结构实现
 * 包含用户交互界面，生成习题，答题，显示结果等功能
 */
import java.util.Scanner;

public class CalculationSystemV20 {
    private static Scanner scanner = new Scanner(System.in);
    private static final int DEFAULT_EXERCISE_COUNT = 50; // 默认习题数量
    
    public static void main(String[] args) {
        // 显示欢迎信息
        displayWelcomeMessage();
        
        // 主循环
        boolean exit = false;
        while (!exit) {
            // 显示菜单
            displayMenu();
            
            // 获取用户选择
            int choice = getUserChoice();
            
            // 处理用户选择
            switch (choice) {
                case 1:
                    startMixedExercises(); // 混合练习（加法和减法）
                    break;
                case 2:
                    startAdditionExercises(); // 加法练习
                    break;
                case 3:
                    startSubtractionExercises(); // 减法练习
                    break;
                case 4:
                    exit = true;
                    displayExitMessage();
                    break;
                default:
                    System.out.println("无效的选择，请重新输入！");
            }
        }
        
        // 关闭扫描器
        scanner.close();
    }
    
    /**
     * 显示欢迎信息
     */
    private static void displayWelcomeMessage() {
        System.out.println("===========================================");
        System.out.println("       加减法口算练习系统 v2.0");
        System.out.println("===========================================");
        System.out.println("欢迎使用面向对象设计的加减法口算练习系统！");
        System.out.println("此系统采用抽象类和继承机制，提供多种练习模式。");
        System.out.println();
    }
    
    /**
     * 显示菜单
     */
    private static void displayMenu() {
        System.out.println("请选择练习模式：");
        System.out.println("1. 混合练习（加法和减法）");
        System.out.println("2. 加法练习");
        System.out.println("3. 减法练习");
        System.out.println("4. 退出系统");
        System.out.print("请输入您的选择 (1-4): ");
    }
    
    /**
     * 获取用户选择
     * @return 用户选择的整数
     */
    private static int getUserChoice() {
        while (true) {
            try {
                return scanner.nextInt();
            } catch (Exception e) {
                System.out.print("请输入有效的数字 (1-4): ");
                scanner.nextLine(); // 清除输入缓冲区
            }
        }
    }
    
    /**
     * 获取用户输入的习题数量
     * @return 习题数量
     */
    private static int getExerciseCount() {
        System.out.print("请输入习题数量 (默认 " + DEFAULT_EXERCISE_COUNT + "): ");
        
        String input = scanner.nextLine();
        if (input.trim().isEmpty()) {
            return DEFAULT_EXERCISE_COUNT;
        }
        
        try {
            int count = Integer.parseInt(input);
            if (count <= 0) {
                System.out.println("习题数量必须大于0，使用默认值。");
                return DEFAULT_EXERCISE_COUNT;
            }
            return count;
        } catch (NumberFormatException e) {
            System.out.println("输入无效，使用默认值。");
            return DEFAULT_EXERCISE_COUNT;
        }
    }
    
    /**
     * 开始混合练习（加法和减法）
     */
    private static void startMixedExercises() {
        System.out.println("\n=== 混合练习模式 ===");
        System.out.println("此模式将生成加法和减法混合的习题。");
        
        // 清除输入缓冲区中的换行符
        scanner.nextLine();
        
        // 获取习题数量
        int count = getExerciseCount();
        
        // 创建习题对象
        Exercise exercise = new Exercise(count);
        
        // 显示习题
        displayAndAnswerExercises(exercise);
    }
    
    /**
     * 开始加法练习
     */
    private static void startAdditionExercises() {
        System.out.println("\n=== 加法练习模式 ===");
        System.out.println("此模式将生成加法习题。");
        
        // 清除输入缓冲区中的换行符
        scanner.nextLine();
        
        // 获取习题数量
        int count = getExerciseCount();
        
        // 创建习题对象并设置为加法练习
        Exercise exercise = new Exercise(count);
        exercise.generateAdditionExercises(count); // 生成指定数量的加法习题
        
        // 显示习题并答题
        displayAndAnswerExercises(exercise);
    }
    
    /**
     * 开始减法练习
     */
    private static void startSubtractionExercises() {
        System.out.println("\n=== 减法练习模式 ===");
        System.out.println("此模式将生成减法习题。");
        
        // 清除输入缓冲区中的换行符
        scanner.nextLine();
        
        // 获取习题数量
        int count = getExerciseCount();
        
        // 创建习题对象并设置为减法练习
        Exercise exercise = new Exercise(count);
        exercise.generateSubtractionExercises(count); // 生成指定数量的减法习题
        
        // 显示习题并答题
        displayAndAnswerExercises(exercise);
    }
    
    /**
     * 显示习题并让用户答题
     * @param exercise 习题对象
     */
    private static void displayAndAnswerExercises(Exercise exercise) {
        // 显示习题
        System.out.println("\n=== 开始答题 ===");
        System.out.println("请仔细计算下列题目：");
        System.out.println();
        exercise.printExercises();
        
        // 提示用户答题
        System.out.println("\n请输入题号和答案，格式：题号 答案");
        System.out.println("例如：1 15 表示第1题的答案是15");
        System.out.println("输入 'done' 完成答题并查看结果");
        
        // 开始答题
        while (true) {
            System.out.print("请输入：");
            String input = scanner.nextLine();
            
            // 检查是否完成答题
            if (input.equalsIgnoreCase("done")) {
                break;
            }
            
            try {
                // 解析输入
                String[] parts = input.split(" ");
                if (parts.length != 2) {
                    System.out.println("输入格式错误，请重试。");
                    continue;
                }
                
                int index = Integer.parseInt(parts[0]) - 1; // 转换为0-based索引
                int answer = Integer.parseInt(parts[1]);
                
                // 检查索引范围
                if (index < 0 || index >= exercise.getTotalCount()) {
                    System.out.println("题号超出范围，请重试。");
                    continue;
                }
                
                // 回答问题
                boolean isCorrect = exercise.answerQuestion(index, answer);
                
                // 显示答题结果
                if (isCorrect) {
                    System.out.println("✓ 回答正确！");
                } else {
                    // 显示正确答案
                    int correctAnswer = exercise.getCalculation(index).getResult();
                    System.out.println("✗ 回答错误。正确答案是：" + correctAnswer);
                }
                
            } catch (NumberFormatException e) {
                System.out.println("输入格式错误，请重试。");
            } catch (Exception e) {
                System.out.println("发生错误：" + e.getMessage());
            }
        }
        
        // 显示练习结果
        exercise.printResult();
        
        // 询问是否显示详细结果
        System.out.print("\n是否需要查看所有题目的正确答案？(y/n): ");
        String showAnswers = scanner.nextLine();
        
        if (showAnswers.equalsIgnoreCase("y")) {
            showAllAnswers(exercise);
        }
        
        // 提示按Enter键继续
        System.out.print("\n按Enter键返回主菜单...");
        scanner.nextLine();
    }
    
    /**
     * 显示所有题目的正确答案
     * @param exercise 习题对象
     */
    private static void showAllAnswers(Exercise exercise) {
        System.out.println("\n=== 所有题目的正确答案 ===");
        for (int i = 0; i < exercise.getTotalCount(); i++) {
            AbstractCalculation calc = exercise.getCalculation(i);
            System.out.println((i + 1) + ". " + calc.getFullExpression());
        }
    }
    
    /**
     * 显示退出信息
     */
    private static void displayExitMessage() {
        System.out.println("\n===========================================");
        System.out.println("感谢使用加减法口算练习系统 v2.0！");
        System.out.println("祝您学习进步！");
        System.out.println("===========================================");
    }
}